# users/utils.py
from django.contrib.auth.backends import ModelBackend
from django.db.models import Q

from users.models import User


def jwt_response_payload_handler(token, user=None, request=None):
    """
    自定义jwt认证成功返回数据
    """
    return {
        'token': token,
        'user_id': user.id,
        'username': user.username
    }


# 扩展登录接口支持使用手机号登录 继承这个（ModelBackend）百度或者源码
class UsernameMobileAuthBackend(ModelBackend):
    ''' 自定义的认证后台 '''

    # 看源码重写authenticate方法  Q对象的作用是在查询之间做逻辑运算（数据库操作中将过Q）
    def authenticate(self, request, username=None, password=None, **kwargs):
        """
        判断用户名(手机号)或者密码是否正确，返回对应的用户对象。

        F对象比较表里面的多个对象
        """
        # 查询数据库的用户名 并核对（Q对象的作用是在查询之间做逻辑运算（数据库操作中将过Q））
        # (Q(username=username) | Q(mobile=username))  | 或的意思 整体的意思是满足二者其一即可登陆
        query_set = User.objects.filter(Q(username=username) | Q(mobile=username))
        try:
            if query_set.exists():
                user = query_set.get()   # 取出唯一的一条数据（取不到或者有多条数据都会出错）
                if user.check_password(password):  # 进入一步判断密码是否正确
                    return user
        except:
            return None


